home *** CD-ROM | disk | FTP | other *** search
- /* TI2Int Ver. 0.9 */
-
- /* This program will read an TI tagged format file and convert it */
- /* to Intel tagged format */
-
- #include <stdio.h>
- int s, tag, tmark, ch, nline, pmsb, plsb, efmark, nofbyte;
- int cksummsb, cksumlsb; /* checksum for msb and lsb files */
- int startaddr; /* load address */
- FILE *fp0, *fp1, *fp2; /* file pointers */
- char filein[15]; /* buffer for input file name */
- char filemsb[15]; /* buffer for file name to store most sig. byte */
- char filelsb[15]; /* buffer for file name to store least sig. byte */
- static char bufmsb[80]; /* temp buffer to store data bytes */
- static char buflsb[80]; /* temp buffer to store data bytes for lsb */
-
-
- main() /* main program */
- {
- int i;
- printf("Enter input file name \n");
- scanf("%s",filein); /* get input file name */
- printf("Enter output file name to store msb\n");
- scanf("%s",filemsb); /* get file name for msb */
- printf("Enter output file name to store lsb\n");
- scanf("%s",filelsb); /* get file name for lsb */
-
- if ((fp0 = fopen(filein,"r")) != NULL) /* open input file for reading only */
- {
- fp1 = fopen(filemsb,"w+"); /* create file for msb */
- fp2 = fopen(filelsb,"w+"); /* create file for lsb */
- pmsb = plsb = 0; /* set pointers to temp buffers = 0 */
- efmark = 0; /* eof mark for output files */
- tmark = 0; /* marker to count '9' or 'A' tags */
- nline = 1; /* line number on input file */
- tag = fgetc(fp0); /* get first tag */
- if (tag == 'K' ) /* if first tag=K skip next 12 char */
- {
- for (i = 0; i < 12; ++i )
- fgetc(fp0);
- }
- else /* if K tag not found then error */
- error(1);
-
- while ((tag = fgetc(fp0)) != EOF ) /* get next tag until EOF */
-
- strip(); /* strip tags */
-
- printf("Conversion complete \n");
- exit(); /* close all files */
- }
- else
- error(2);
- }
-
- strip()
- {
- int i, data;
-
- switch(tag)
- {
- case '3' :
- case '4' : /* error, unresolved external references */
- case '!' :
- case 'E' :
- case 'Y' :
- case 'Z' :
- error(3);
- break;
-
- case 'M' :
- case 'I' :
- case 'S' :
- case 'C' : /* error, PSEG, CSEG or DSEG relative addresses */
- case 'T' :
- case '&' :
- case '#' :
- case 'P' :
- case 'N' :
- error(4);
- break;
-
- case '1' : /* ignore next 4 characters */
- case '2' :
- case '8' :
- case '7' :
- for (i = 0; i < 4; ++i )
- fgetc(fp0);
- break;
-
- case 'F' : /* end of data tag. Ignore characters till eol mark */
- while (data != '\n')
- data = fgetc(fp0);
- ++nline;
- break;
-
- case '9' : /* read next four characters to give load address */
- case 'A' :
- if (tmark > 0 )
- {
- convert(); /* if second 'A' or '9' tag then start new line */
-
- tmark++;
- }
- fscanf(fp0, "%4x", &startaddr );
- tmark++;
- break;
-
- case '6' : /* ignore next ten characters */
- case '5' :
- case 'G' :
- case 'H' :
- case 'U' :
- for (i = 0; i < 10; ++i )
- fgetc(fp0);
- break;
-
- case 'W' : /* ignore next 14 characters */
- case 'J' :
- for (i = 0; i < 14; ++i )
- fgetc(fp0);
- break;
-
- case 'B' : /* read next 4 charcters and split into msb and lsb */
- for (i = 0; i < 2; ++i )
- bufmsb[pmsb++] = fgetc(fp0);
- for (i = 0; i < 2; ++i )
- buflsb[plsb++] = fgetc(fp0);
- if ( pmsb >= 60)
-
- convert(); /* start new line */
-
- break;
-
- case ':' : /* end of file tag */
-
- convert(); /* output all data in buffers */
-
- efmark = 1;
-
- convert(); /* print eof record */
-
- printf("Conversion complete \n");
- exit(); /* close all files */
- break;
-
- default :
- error(5);
- break;
- }
- }
-
- convert() /* convert to Intel format */
- {
- int i, j, k, data;
-
- i = 0; /* loop count for msb file */
- j = 0; /* loop count for lsb file */
- nofbyte = pmsb / 2; /* number of bytes = 1/2 number of charaters */
-
- fprintf(fp1, ":%02x%04x", nofbyte, startaddr); /* output load address */
- fprintf(fp2, ":%02x%04x", nofbyte, startaddr); /* and # of data bytes */
-
- fprintf(fp1, "%02d", efmark);
- fprintf(fp2, "%02d", efmark); /* print whether eof record or not */
-
- for (k=0; k < pmsb; ++k ) /* transfer data from buffer to output files */
- {
- data = bufmsb[i++];
- fputc(data,fp1);
-
- data = buflsb[j++];
- fputc(data,fp2);
- }
- cksumint(); /* go do check sum */
-
- fprintf(fp1,"%02x\n", cksummsb); /* output checksum */
- fprintf(fp2,"%02x\n", cksumlsb);
-
- startaddr += nofbyte; /* increment load address for next line */
- pmsb = plsb = 0; /* initialize pointers */
- }
-
-
- cksumint() /* do checksum */
- {
- int k, m, n, temp;
- char *p, *q; /* buffers to store data for checksum */
-
- cksummsb = cksumlsb = nofbyte;
-
- m = startaddr & 0xFF00; /* read msb of load address */
- m = m >> 8; /* shift right */
- m += startaddr & 0x00FF ; /* add lsb of load address */
-
- cksummsb += m; /* add to checksum */
- cksumlsb += m;
-
- p = bufmsb; /* initialize pointer to start of data bytes*/
- for (k=0; k < nofbyte; ++k ) /* transfer data from buffer to output files */
- {
- sscanf(p ,"%02x", &temp); /* convert each byte to hex value */
- cksummsb += temp; /* calculate checksum for msb */
- p += 2; /* increment to point at next byte */
- }
-
- q = buflsb;
- for (k=0; k < nofbyte; ++k ) /* transfer data from buffer to output files */
- {
- sscanf(q, "%02x", &temp); /* convert each byte to hex value */
- cksumlsb += temp; /* calculate checksum for lsb */
- q += 2;
- }
-
- cksummsb += efmark; /* add value of eof mark */
- cksumlsb += efmark;
-
- cksummsb = ((~cksummsb) + 1) & 0x00FF ; /* two's complement of checksum */
- cksumlsb = ((~cksumlsb) + 1) & 0x00FF ; /* and remove upper 8 bits */
- }
-
- error(s) /* print error message */
- {
- printf(" Execution terminated \n" );
- switch(s)
- {
- case 5 :
- printf(" Unknown tag %c encountered on line number %d \n",tag,nline);
- exit();
-
- case 4 :
- printf(" Illegal tag %c encountered on line number %d \n",tag,nline);
- printf(" Segments not supported. Define absolute addresses \n");
- exit();
-
- case 3 :
- printf(" Illegal tag %c encountered on line number %d \n",tag,nline);
- printf(" Unresolved external references \n");
- exit();
-
- case 2 :
- printf(" File %s not found \n",filein);
- exit();
-
- case 1 :
- printf(" Illegal object format in %s, K tag not found\n",filein);
- exit();
- }
- }